﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Domain
{
    /// <summary>
    /// Возрастное ограничение категории
    /// </summary>
    public class AgeLimit
    {
        /// <summary>
        /// Минимальный возраст
        /// </summary>
        public int? MinAge { get; set; }

        /// <summary>
        /// Максимальный возраст
        /// </summary>
        public int? MaxAge { get; set; }

        /// <summary>
        /// Создаёт класс AgeLimit
        /// </summary>
        /// <param name="minAge">Минимальный возраст</param>
        /// <param name="maxAge">Максимальный возраст</param>
        public AgeLimit(int? minAge, int? maxAge)
        {
            MinAge = minAge;
            MaxAge = maxAge;
        }

        /// <summary>
        /// Создаёт класс AgeLimit
        /// </summary>
        public AgeLimit()
        {

        }

        /// <summary>
        /// Проверить возраст участника
        /// </summary>
        /// <param name="birthday">День рождения участника</param>
        /// <param name="validationType">Тип проверки возраста</param>
        /// <param name="raceDate">Дата гонки</param>
        /// <returns>Проходит ли участник установленные возрастные ограничения</returns>
        public bool Validate(DateTime birthday, AgeValidationType validationType, DateTime raceDate)
        {
            bool result = true;

            if (validationType == AgeValidationType.YearOnly)
            {
                int age = raceDate.Year - birthday.Year;
                
                if (MinAge != null && age < MinAge)
                    result = false;

                if (MaxAge != null && age > MaxAge)
                    result = false;
            }

            if (validationType == AgeValidationType.Exact)
            {
                if (MinAge != null)
                {
                    DateTime minBirthday = new DateTime(raceDate.Year - MinAge.Value, raceDate.Month, raceDate.Day);

                    if (birthday > minBirthday)
                        result = false;
                }

                if (MaxAge != null)
                {
                    DateTime maxBirthday = new DateTime(raceDate.Year - MaxAge.Value - 1, raceDate.Month, raceDate.Day);

                    if (birthday < maxBirthday)
                        result = false;
                }

            }

            return result;
        }
    }
}
